#include "exit.h"
#include "led.h"

/**********************************
 * @brief       外部引脚中断回调函数
 * @param       arg：中断引脚号
 * @retval      无
 * @exp         IRAM_ATTR: 这里的 IRAM_ATTR 属性用于将中断处理函数存储在内部 RAM 中，
                目的在于减少延迟
 ***********************************/
static IRAM_ATTR void  exit_gpio_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    if (gpio_num == EXIT_PIN)
    {
        LED_TOGGLE();
       // printf("gpio_0_entry\r\n"); //esp32的中断中禁用printf
    }
    //printf("gpio_isr_entry\r\n");

}



/**********************************
 * @brief       外部引脚中断初始化
 * @param       无
 * @retval      无
 ***********************************/
void exit_init(void)
{
    gpio_config_t user_exit_struct={
        .intr_type      =   GPIO_INTR_NEGEDGE,        /*上升沿触发 */
        .mode           =   GPIO_MODE_INPUT,        /* 输入输出模式 */
        .pull_up_en     =   GPIO_PULLUP_ENABLE,     /* 使能上拉 */
        .pull_down_en   =   GPIO_PULLDOWN_DISABLE,  /* 失能下拉 */
        .pin_bit_mask   =   (1<<EXIT_PIN)           /* 设置的引脚的位掩码*/      
        };
        gpio_config(&user_exit_struct);              /* 配置 GPIO */

        /* 注册中断服务 */
        gpio_install_isr_service(ESP_INTR_FLAG_EDGE);//ESP_INTR_FLAG_EDGE  注册边沿中断，结合引脚的intr_type来确定是是什么边缘触发
        /* 设置 GPIO 的中断回调函数 */
        gpio_isr_handler_add(EXIT_PIN,exit_gpio_isr_handler,(void *)EXIT_PIN); //将io以参数测形式传递给回调函数，便于多个exit公用一个回调函数
}

